/**
 * core/workflowService.js
 * 提供：根据任务类型选择对应 workflow，并准备执行参数。
 */

const config = require('../config');
const {
  getSpeakerIdMapping,
  getMaterialIdMapping,
  getTaskPointsMapping,
} = require('../utils/mappings');
const {
  generateTaskId,
  generateTaskTitle
} = require('../utils/idGenerator');

/**
 * 根据 taskType 来选择执行 coze 工作流时使用的参数
 * @param {string} taskType - 任务类型
 * @param {object} parameters - 已准备好的参数对象
 * @returns {object} - 传递给 Coze 的参数对象
 */
function getWorkflowParametersToCoze(taskType, parameters) {
  switch (taskType) {

    // === 数字人类型 ===
    case '竖屏|AI虚拟形象':
      return {
        api_token_fy: config.api.fy_token,
        speaker_id_fy: parameters.speaker_id,
        sucai_id_fy: parameters.material_id,
        times: parameters.times || '20秒',
        topic: parameters.topic,
        issubtitle: parameters.issubtitle || 'true',
        content: parameters.content || '默认'
      };

    case '竖屏|卡通数字人':
      return {
        api_token_fy: config.api.fy_token,
        speaker_id_fy: parameters.speaker_id,
        sucai_id_fy: parameters.material_id,
        times: parameters.times || '20秒',
        topic: parameters.topic,
        issubtitle: parameters.issubtitle || 'true',
        content: parameters.content || '默认'
      };

    case '定制|爱尔数字人':
      return {
        api_token_fy: config.api.fy_token,
        speaker_id_fy: parameters.speaker_id,
        sucai_id_fy: parameters.material_id,
        times: parameters.times || '20秒',
        topic: parameters.topic,
        issubtitle: parameters.issubtitle || 'true',
        content: parameters.content || '默认'
      };

    // === 主题类型（只需要 topic）===
    case '横屏|混剪火柴人':
      return {
        title: parameters.topic
      };

    case '横屏|3D卡通育儿':
      return {
        title: parameters.topic
      };

    // === 主题+音频类型 ===
    case '横屏|像素叙事型':
      return {
        input: parameters.topic,
        audio_url: "https://ve-template-0920.oss-cn-shanghai.aliyuncs.com/uploads/1755747955094_3i1kn81s4er.mp3"
      };

    // === 主题+输入类型 ===
    case '横屏|白底映彩类':
      return {
        input: parameters.topic
      };

    // === 主题+内容类型 ===
    case '竖屏|混剪素材类':
      return {
        topic: parameters.topic,
        content: parameters.content || ""
      };

    case '横屏|情景故事型':
      return {
        book_fm: "",
        content: parameters.content || "默认",
        story: parameters.topic
      };

    // === 多输入类型 ===
    case '横屏|批判警示类':
      return {
        author: "EYEer AI",
        bg_text: "打破认知",
        left_top: "反圣母 | 反常识 | 反鸡汤",
        right_top: "让健康成为一种生活方式",
        subject: parameters.topic,
        Content: parameters.content || ""
      };

    // === 云渲染专用 ===
    case '云渲染':
      return {
        url: parameters.url
      };

    // === 默认配置 ===
    default:
      return {
        api_token_fy: config.api.fy_token,
        speaker_id_fy: parameters.speaker_id,
        sucai_id_fy: parameters.material_id,
        times: parameters.times || '10秒',
        topic: parameters.topic || '近视手术1',
        issubtitle: parameters.issubtitle || 'true'
      };
  }
}


/**
 * 根据任务类型获取 workflowId
 */
function getWorkflowId(taskType) {
  if (!taskType || !config.workflowIds) return config.workflowIds.default;

  const id =
    config.workflowIds[taskType] ||
    config.workflowIds['default'] ||
    Object.values(config.workflowIds)[0];

  return id;
}

/**
 * 构建 workflow 执行参数
 * @param {object} taskData - 来自前端或数据库的任务数据
 */
function getWorkflowParameters(taskData) {
  // 所有工作流，都可能会用到下面这些参数，由新类型参数则需要这里添加，前端传的 变量名 和这里一致

  return {
    topic: taskData.topic || "默认主题词青少年护眼",
    content: taskData.content || "",
    otherContent: taskData.otherContent || '',
    speaker: taskData.speaker || '默认', // 声音的名称
    speaker_id: getSpeakerIdMapping(taskData.speaker), // 声音的id
    // emotion: task.Dataemotion||'默认', // 情感的名称
    // emotion_id: getEmotionMapping(emotion), // 情感的id
    material: taskData.material || '', // 素材的名称
    material_id: getMaterialIdMapping(taskData.material),
    // digital_human: digitalHuman, // 数字人名称
    times: taskData.times, // 视频的时长
    images: taskData.images || [], // 可能传入的图片
    style: taskData.style || '', // 类型字段，现没用到
    issubtitle: taskData.issubtitle || 'true'
  };
}

/**
 * 构建一个完整的任务对象（用于提交前）
 * @param {object} raw - 原始请求传入的任务数据
 */
function buildTask(raw, userId) {
  const task_id = generateTaskId();
  const title = generateTaskTitle(raw.content);

  const workflow_id = getWorkflowId(raw.taskType);
  const parameters = getWorkflowParameters(raw);
  const use_points = getTaskPointsMapping(raw.taskType);

  const now = new Date();

  return {
    taskId: task_id, // 任务ID
    userId: userId, // 对应用户的ID
    title: title, // 视频的标题
    workflowId: workflow_id, // 执行的工作流
    parameters: parameters, // 使用的参数
    // topic : raw.topic || "默认主题词青少年护眼",     放到参数列表里
    // content: raw.content || "文案从主题词生成...",   放到参数列表里
    taskType: raw.taskType, // 任务类型，或任务标题，和工作流对应
    status: 'running', // 任务状态
    result: {}, // 存储结果字段
    createdAt: now, // 创建时间
    updatedAt: now, // 更新时间
    requiredPoints: use_points, // 任务消耗的积分
    executeId: null, // 提交任务后，coze返回的 executeID 用于异步查询任务状态
    debugUrl: null,
    retryCount: 0, // 当前重试次数
    maxRetries: 5, // 最大重试次数5次
    lastRetryAt: null, // 上次重试时间
    pointsDeducted: false, // 是否已扣除积分（用于防止重复扣除）
  };
}

module.exports = {
  getWorkflowId,
  getWorkflowParameters,
  getWorkflowParametersToCoze,
  buildTask
};